package club.ljwang.service;

import club.ljwang.dao.MenuDao;
import club.ljwang.dao.RoleDao;
import club.ljwang.pojo.Menu;
import club.ljwang.pojo.Menu2;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.UUID;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = MenuService.class)
@Transactional
public class MenuServiceImpl implements MenuService {
    @Autowired
    MenuDao menuDao;
    @Autowired
    RoleDao roleDao;
    @Override
    public List<Menu2> getMenus(Integer id) {
        //获取一级菜单
        List<Menu2> menus = menuDao.getMenusByParentId(id);
        getChildrenMenu(menus);
        return menus;
    }

    @Override
    public void add(Menu menu) {
        //更新一下当前菜单path 因为展示el-menu的index属性取的这个值（注：index不能重复可以使用UUID）
        menu.setPath(UUID.randomUUID().toString());
        menuDao.add(menu);
    }


    @Override
    public List<Menu2> getMenuList(List<Integer> roleIds) {
        Map map = new HashMap();
        map.put("roles",roleIds);
        map.put("id",0);
        //先查询出角色的一级菜单
        List<Menu2> roleMenus = roleDao.getRoleMenus(map);
        //递归查询一级以及下面各级菜单的子菜单
        getChildrenMenu(roleMenus,map);
        return roleMenus;
    }

    private void getChildrenMenu(List<Menu2> menus, Map map){
        if (CollectionUtil.isNotEmpty(menus)){
            for (Menu2 menu : menus) {
                map.put("id",menu.getId());
                List<Menu2> cmenus = roleDao.getRoleMenus(map);
                menu.setChildren(cmenus);
                getChildrenMenu(cmenus,map);
            }
        }
    }

    private void getChildrenMenu(List<Menu2> menus){
        if (CollectionUtil.isNotEmpty(menus)){
            for (Menu2 menu : menus) {
                List<Menu2> cmenus = menuDao.getMenusByParentId(menu.getId());
                menu.setChildren(cmenus);
                getChildrenMenu(cmenus);
            }
        }
    }


}

